/// 自主学习演示 - AI主动从词典学习
/// 
/// 展示：
/// 1. 从新华词典自主学习
/// 2. 自动构建知识图谱
/// 3. 自我测试和反思
/// 4. 主动探索相关概念

use neurosymbolic_ai::{AutonomousLearner, DictionaryData, ActiveLearningDialogue};
use std::io::{self, Write};

fn main() {
    println!("╔════════════════════════════════════════════════════════════╗");
    println!("║          自主学习AI系统                                    ║");
    println!("║     Autonomous Learning System                            ║");
    println!("║                                                           ║");
    println!("║     让AI自己学习新华词典                                   ║");
    println!("╚════════════════════════════════════════════════════════════╝\n");

    println!("请选择模式：");
    println!("1. 自主学习演示（AI读词典）");
    println!("2. 学习后对话测试");
    println!("3. 加载外部词典文件");
    print!("\n请输入选项 (1-3): ");
    io::stdout().flush().unwrap();

    let mut choice = String::new();
    io::stdin().read_line(&mut choice).unwrap();

    match choice.trim() {
        "1" => demo_autonomous_learning(),
        "2" => demo_learning_and_chat(),
        "3" => demo_load_external_dictionary(),
        _ => {
            println!("无效选项，运行模式1...\n");
            demo_autonomous_learning();
        }
    }
}

/// 模式1: 自主学习演示
fn demo_autonomous_learning() {
    println!("\n{}", "=".repeat(60));
    println!("【模式1】自主学习演示");
    println!("{}\n", "=".repeat(60));

    // 创建学习器
    let mut learner = AutonomousLearner::new();

    // 准备词典数据
    println!("📚 准备词典数据...");
    let dictionary = DictionaryData::create_sample();
    println!("✓ 加载了 {} 个词条\n", dictionary.entries.len());

    // 显示词典示例
    println!("词典示例（前3条）:");
    for (i, entry) in dictionary.entries.iter().take(3).enumerate() {
        println!("  {}. {} - {}", i + 1, entry.word, entry.definition);
    }
    println!();

    // AI开始自主学习
    println!("{}", "-".repeat(60));
    learner.learn_from_dictionary(&dictionary);
    println!("{}", "-".repeat(60));

    // 学习统计
    let stats = learner.get_statistics();
    println!("\n📊 学习统计:");
    println!("  • 学习会话数: {}", stats.total_sessions);
    println!("  • 掌握概念数: {}", stats.total_concepts);
    println!("  • 平均掌握度: {:.2}%", stats.average_mastery * 100.0);

    // 自我测试
    println!();
    learner.self_test(10);

    // 主动探索
    println!();
    learner.active_exploration("人工智能", 2);

    // 导出知识
    println!("\n{}", "=".repeat(60));
    println!("AI学到的知识:");
    println!("{}", "=".repeat(60));
    for line in learner.export_knowledge().iter().take(20) {
        println!("{}", line);
    }
    println!("...(更多)\n");

    println!("✅ 演示完成！");
}

/// 模式2: 学习后对话测试
fn demo_learning_and_chat() {
    println!("\n{}", "=".repeat(60));
    println!("【模式2】学习后对话测试");
    println!("{}\n", "=".repeat(60));

    // AI先自主学习
    println!("第一步：AI自主学习词典...\n");
    let mut learner = AutonomousLearner::new();
    let dictionary = DictionaryData::create_sample();
    learner.learn_from_dictionary(&dictionary);

    // 将学到的知识转移到对话系统
    println!("\n第二步：将知识转移到对话系统...");
    let mut dialogue = ActiveLearningDialogue::new();

    // 转移概念
    let mut transfer_count = 0;
    for (name, concept) in learner.reasoning_chain().knowledge_graph().concepts.iter() {
        dialogue.reasoning_chain_mut().knowledge_graph_mut().add_concept(
            name,
            &concept.description,
            "词典",
        );
        transfer_count += 1;
    }
    
    // 转移关系
    for relation in learner.reasoning_chain().knowledge_graph().get_all_relations() {
        dialogue.reasoning_chain_mut().knowledge_graph_mut().add_relation(relation);
    }
    
    println!("✅ 成功转移 {} 个概念和关系到对话系统\n", transfer_count);
    println!("💡 提示：AI已经学习了词典，现在可以和它对话了！\n");
    println!("可以问它学到的概念，例如：");
    println!("  • 什么是人工智能");
    println!("  • 机器学习是什么");
    println!("  • 解释一下深度学习\n");

    println!("输入 'quit' 退出\n");

    loop {
        print!("👤 您: ");
        io::stdout().flush().unwrap();

        let mut input = String::new();
        if io::stdin().read_line(&mut input).is_err() {
            continue;
        }

        let input = input.trim();
        if input.is_empty() {
            continue;
        }

        if input == "quit" || input == "exit" {
            break;
        }

        if input == "stats" {
            let stats = learner.get_statistics();
            println!("\n📊 AI学习统计:");
            println!("  掌握概念: {}", stats.total_concepts);
            println!("  平均掌握度: {:.2}%\n", stats.average_mastery * 100.0);
            continue;
        }

        // 使用对话系统回答
        dialogue.chat(input);
    }

    println!("\n👋 对话结束");
}

/// 模式3: 加载外部词典文件
fn demo_load_external_dictionary() {
    println!("\n{}", "=".repeat(60));
    println!("【模式3】加载外部词典");
    println!("{}\n", "=".repeat(60));

    println!("词典文件格式说明:");
    println!("  每行格式: 词语|定义|例句|同义词|反义词");
    println!("  用 | 分隔，用 ; 分隔多个例句/同义词");
    println!();
    println!("示例:");
    println!("  人工智能|模拟人类智能的技术|AI应用广泛|AI;智能系统|");
    println!();

    print!("请输入词典文件路径（或按回车使用示例数据）: ");
    io::stdout().flush().unwrap();

    let mut path = String::new();
    io::stdin().read_line(&mut path).unwrap();
    let path = path.trim();

    let mut learner = AutonomousLearner::new();

    let dictionary = if path.is_empty() {
        println!("\n使用示例数据...");
        DictionaryData::create_sample()
    } else {
        match DictionaryData::load_from_file(path) {
            Ok(data) => {
                println!("\n✓ 成功加载 {} 条词条", data.entries.len());
                data
            }
            Err(e) => {
                println!("\n❌ 加载失败: {}", e);
                println!("使用示例数据代替...");
                DictionaryData::create_sample()
            }
        }
    };

    // 开始学习
    println!();
    learner.learn_from_dictionary(&dictionary);

    // 统计
    let stats = learner.get_statistics();
    println!("\n📊 学习完成!");
    println!("  掌握概念: {}", stats.total_concepts);

    // 保存知识图谱
    print!("\n是否保存学到的知识? (y/n): ");
    io::stdout().flush().unwrap();
    
    let mut save = String::new();
    io::stdin().read_line(&mut save).unwrap();
    
    if save.trim().to_lowercase() == "y" {
        use std::fs::File;
        use std::io::Write;

        let mut file = File::create("learned_knowledge.txt").unwrap();
        for line in learner.export_knowledge() {
            writeln!(file, "{}", line).ok();
        }
        println!("✅ 知识已保存到 learned_knowledge.txt");
    }
}

